## ZITADEL with Postgres

PostgreSQL is the default database for ZITADEL due to its reliability, robustness, and adherence to SQL standards. It is well-suited for handling the complex data requirements of an identity management system.

If you are using Zitadel v2 and want to use a PostgreSQL database, you can [overwrite the default configuration](../configure/configure.mdx).

Currently, versions 14 to 17 are supported.

Postgres can be configured as follows:
```yaml
Database:
  postgres:
    Host: localhost
    Port: 5432
    Database: zitadel
    AwaitInitialConn: 5m
    MaxOpenConns: 15
    MaxIdleConns: 10
    MaxConnLifetime: 1h
    MaxConnIdleTime: 5m
    Options:
    User:
      Username: zitadel
      Password: zitadel
      SSL:
        Mode: disable
        RootCert:
        Cert:
        Key:
    Admin:
      Username: postgres
      Password: postgres
      SSL:
        Mode: disable
        RootCert:
        Cert:
        Key:
```

The admin user is only needed for the installation step but can also be avoided
by preparing the necessary requirements:

* the zitadel user
* the zitadel database
* granting required permissions to the zitadel user

```sql
CREATE ROLE zitadel LOGIN;
CREATE DATABASE zitadel;
GRANT CONNECT, CREATE ON DATABASE zitadel TO zitadel;
```

Don't forget to adjust `pg_hba.conf` and set a password for the zitadel user.

With the setup done, follow the [phases guide](/docs/self-hosting/manage/updating_scaling#separating-init-and-setup-from-the-runtime)
to run the init and then setup phase to get all necessary tables and data set up.
